/**
 * 版权所有 2009-2012山东新北洋信息技术股份有限公司
 * 保留所有权利。
 */
package com.linyaonan.leetcode.easy._53_03;

/**
 *
 * 一个长度为n-1的递增排序数组中的所有数字都是唯一的，并且每个数字都在范围0～n-1之内。在范围0～n-1内的n个数字中有且只有一个数字不在该数组中，请找出这个数字。
 *
 *  
 *
 * 示例 1:
 *
 * 输入: [0,1,3]
 * 输出: 2
 * 示例 2:
 *
 * 输入: [0,1,2,3,4,5,6,7,9]
 * 输出: 8
 *  
 *
 * 限制：
 *
 * 1 <= 数组长度 <= 10000
 *
 *
 * @ProjectName: leetcode
 * @Package: com.linyaonan.leetcode.easy._53_03
 * @ClassName: MissingNumber
 * @Author: linyaonan
 * @Date: 2020/4/2 16:44
 */
public class MissingNumber {

    public int missingNumber(int[] nums) {
        int start = 0;
        int end = nums.length - 1;
        // 头缺少
        if (nums[start] != 0) {
            return 0;
        }
        // 最后一位正确，表示之前都正确
        if (nums[nums.length - 1] == nums.length - 1) {
            return nums.length;
        }
        while (start <= end) {
            // 缺少的就是目标值
            if (end - start == 1) {
                return (nums[start] + nums[end]) >> 1;
            }
            // 求出中间index
            int mid = start + ((end - start) >> 1);
            // 预计的中间值
            double pom = (double) (nums[start] + nums[end]) / 2;
            // 预计的小于当前的，说明当前增大了，缺失的位于左边
            if (pom <= nums[mid]) {
                end = mid;
            } else {
                start = mid;
            }
        }
        return -1;
    }
}
